/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

///////////////////////////////////////////////////////////
/// \file TCP.h Ce fichier contient les fonction nécessaires 
/// à la manipulation des sockets TCP. Les différents types 
/// et énumérations utilisés sont définient dans Network.h.
///////////////////////////////////////////////////////////

#ifndef CSLP_TCP_HEADER
# define CSLP_TCP_HEADER

# include "dll.h"
# include "Network.h"

# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */

  ///////////////////////////////////////////////////////////
  /// Permet d'initialiser un socket TCP.
  ///
  /// Il est conseillé d'appeller cette méthode lors de l'initialisation
  /// d'une variable CSLP_TCPSOCKET et il est nécessaire de l'appeller avant
  /// de l'utiliser.
  ///
  /// \return CSLP_INVALID_SOCKET en cas d'erreur, sinon une autre valeur.
  ///////////////////////////////////////////////////////////
  CSLP_TCPSOCKET DLL_IMPEXP CSLP_InitTCPSocket();

  ///////////////////////////////////////////////////////////
  /// Permet de connecter le socket
  ///
  /// Le socket ne doit pas être à l'écoute d'un port et ne doit pas être
  /// déjà connecté. Enfin il doit être initialiser avec la fonction 
  /// CSLP_InitTCPSocket().
  ///
  /// \param sock Le socket à connecter.
  /// \param IP L'addresse ip de destination sous forme d'entier au format
  /// big endian (voir CSLP_ULongToBigEndian)
  /// \param port Le port de destination.
  ///
  /// \return NONE en cas de succès,
  /// \return ERROR en cas d'erreur interne (socket invalide,...)
  /// \return DISCONNECTED si la connection n'a pas aboutie (serveur 
  /// déconnecté, refus de connexion,...)
  ///
  /// \sa CSLP_StringIPToULong(), CSLP_InitTCPSocket(), 
  /// CSLP_GetLastNetworkError(), CSLP_NETWORK_ERROR
  ///////////////////////////////////////////////////////////
  CSLP_NETWORK_ERROR DLL_IMPEXP CSLP_Connect(CSLP_TCPSOCKET sock, unsigned long IP, unsigned short port);

  ///////////////////////////////////////////////////////////
  /// Permet d'envoyer une chaine de caractère.
  ///
  /// Est équivalent à: \n
  /// CSLP_Send(sock, str, strlen(str) + 1);
  ///
  /// \param sock Le socket utilisé pour transmettre les données.
  /// \param str La chaine de caractère à envoyer. ATTENTION: Celle-ci
  /// doit se terminer par un '\\0'
  /// 
  /// \return NONE en cas de succès
  /// \return ERROR en cas d'échec (socket invalide, ...)
  /// \return DISCONNECTED si une erreur de connexion s'est produite
  ///////////////////////////////////////////////////////////
  CSLP_NETWORK_ERROR DLL_IMPEXP CSLP_SendString(CSLP_TCPSOCKET sock, const char* str);

  ///////////////////////////////////////////////////////////
  /// Permet l'envois de données
  ///
  /// \param sock Le socket à utiliser pour l'envois de données.
  /// \param data Un pointeur sur les données à envoyer.
  /// \param len Le nombre d'octets à lire dans data
  ///
  /// \return NONE en cas de succès
  /// \return ERROR en cas d'échec (socket invalide,...)
  /// \return DISCONNECTED si une erreur de connexion s'est produite
  ///////////////////////////////////////////////////////////
  CSLP_NETWORK_ERROR DLL_IMPEXP CSLP_Send(CSLP_TCPSOCKET sock, const void* data, size_t len);

  ///////////////////////////////////////////////////////////
  /// Permet la réception de données
  ///
  /// \param sock Le socket à utiliser pour la réception de données
  /// \param data Un pointeur sur un tableau d'octets qui sera remplis
  /// \param dataLen Le nombre d'octet de data
  /// \param bytesWrite Le nombre d'octets écrit dans data
  ///
  /// \return NONE en cas de données reçus avec succès.
  /// \return ERROR en cas d'erreur interne (socket invalide,...)
  /// \return DISCONNECTED en cas d'erreur de connexion.
  ///////////////////////////////////////////////////////////
  CSLP_NETWORK_ERROR DLL_IMPEXP CSLP_Receive(CSLP_TCPSOCKET sock, void* data, size_t dataLen, size_t* bytesWrite);

  ///////////////////////////////////////////////////////////
  /// Permet l'écoute d'un port
  ///
  /// \param sock Le socket utilisé pour l'écoute. ATTENTION: Il ne pourra
  /// plus être utilisé pour l'émission/réception de données tant qu'il
  /// n'a pas été fermé et réinitialisé.
  /// \param port Le port à écouter.
  ///
  /// \return 0 en cas de succès, une autre valeur en cas d'échec
  ///////////////////////////////////////////////////////////
  int DLL_IMPEXP CSLP_Listen(CSLP_TCPSOCKET sock, unsigned short port);

  ///////////////////////////////////////////////////////////
  /// Permet d'accepter la connexion d'un client
  ///
  /// \param serverSocket Un socket à l'écoute d'un port
  /// \param clientSocket Un socket non initialisé, mais alloué, qui sera 
  /// initialisé pour permettre la communication avec le nouveau client.
  /// \param clientIP Un entier au format big endian qui sera initialisée 
  /// à l'IP du client. 
  /// Si NULL est spécifié, le paramètre sera ignoré.
  /// \param clientPort Un pointeur qui sera initialisé au port utilisé par 
  /// le client. Si NULL est spécifié, le paramètre sera ignoré.
  ///
  /// \return 0 en cas de succès, une autre valeur en cas d'erreur
  ///////////////////////////////////////////////////////////
  int DLL_IMPEXP CSLP_Accept(CSLP_TCPSOCKET serverSocket, CSLP_TCPSOCKET* clientSocket, unsigned long* clientIP, unsigned short* clientPort);

  ///////////////////////////////////////////////////////////
  /// Permet de libérer les ressources allouée par le socket
  ///
  /// \param sock Le socket à fermer
  ///////////////////////////////////////////////////////////
  void DLL_IMPEXP CSLP_CloseTCPSocket(CSLP_TCPSOCKET sock);

# ifdef __cplusplus
}
# endif /* __cplusplus */

#endif

